<?php
/**
 * Page gestion des salles
 * Permet l'affichage, l'ajout, la suppression et la modification d'une salle
 * ainsi que les batiments. Permet aussi d'associer une salle a un batîment.
 *
 * @category actions
 * @package administration
 *
 * @author M.CASTANHEIRO, M.MEUNIER, O.PATTE, C.PORTEMER, R.THERY-HERMAIN
 * @version 1.0
 */
class salleAction extends shAction {
    /**
     * Fonction appellée automatiquement pour toutes les requêtes de l'action
     */
    public function init() {
	$this->setTitle('Gestion des salles');
	$this->addAriane(shRequest::link('administration'), 'Administration');
    }

    /**
     * Execute la méthode par défaut pour l'action salle
     */
    public function execute() {
	// Récupération des batiments connus
	$batiments = shSGBD::select (
	    'SELECT id,intitule FROM batiment ORDER BY intitule ASC'
	);

	// Pour chaque batiment on stocke les salles associé
	$tableaux = array();
	foreach ($batiments as $batiment) {
	    $tableaux[$batiment->id] = shSGBD::select(
		    'SELECT  id,intitule FROM salle WHERE id_batiment=? ORDER BY intitule ASC'
		    ,array($batiment->id));
	}

	$this->assign('batiments', $batiments);
	$this->assign('tableaux',$tableaux);
    }


    /**
     * Création d'une salle
     */
    public function executeCreate($_id_batiment = null) {
	$this->setTitle('Ajout d\'une salle');
	$this->addAriane(shRequest::link('administration', 'salle'), 'Gestion des salles');

	
	if ($_id_batiment == null) {
	    throw new Exception('id_batiment est inconnu');
	    return false;
	}

	$formulaire = new shFormulaire;
	$formulaire->setSubmitText('Ajouter cette salle');

	// Intitulé de la salle
	shField::text('Intitulé')->appendTo($formulaire);

	// Accès au personne a mobilité réduite
	shField::checkbox('Accès Handicapés')
		->appendTo($formulaire);

	// Liste des batiments
	$select = shField::select('Bâtiment')
		->setValue($_id_batiment)
		->appendTo($formulaire);

	// On récupère les batiments
	$batiments = shSGBD::select ('SELECT id, intitule FROM batiment ORDER BY intitule ASC');

	// Affectation des bâtiment à la selectbox
	foreach($batiments AS $batiment) {
	    $select->addOption($batiment->id, $batiment->intitule);
	}

	$formulaire->setCheck(function($formulaire) {
		    if (!$formulaire->isError()) {
			// On vérifie qu'on a pas le même intitulé qui existe
			$salle = shSGBD::selectOne('SELECT count(id) AS count '.
				'FROM salle '.
				'WHERE intitule=:intitule AND id_batiment=:id_batiment' ,
				array (':intitule'=>$formulaire->getField('Intitulé')->getValue(),
				    ':id_batiment'=>$formulaire->getField('Bâtiment')->getValue()));
			if ($salle->count > 0) {
			    $formulaire->getField('Intitulé')->setError('Une autre salle possède le même intitulé');
			}
		    }
		})



	;

	$formulaire->setSubmit(function($formulaire) {
		    // On crée le nouveau profil
		    shSGBD::insert('INSERT INTO salle (intitule,id_batiment,acces_handicap) VALUES (:intitule,:id_batiment,:acces_handicap)',
			    array( ':intitule' => $formulaire->getField('Intitulé')->getValue(),
			    ':id_batiment' => $formulaire->getField('Batiment')->getValue(),
			    ':acces_handicap' => $formulaire->getField('Accès Handicapés')->getValue()));
		    shAction::redirect('administration','salle');
		})



	;

	$this->assign('formulaire', $formulaire);
    }


    /**
     * Modification d'une salle
     * @param <integer> Identifiant de la salle à modifier
     */
    public function executeEdit($id_salle) {
	$this->setTitle('Modification d\'une salle');
	$this->addAriane(shRequest::link('administration', 'salle'), 'Gestion des salles');
	
	// On récupère le profil
	if ( !($salle = shSGBD::selectOne(
	    'SELECT  id,id_batiment,intitule,acces_handicap FROM salle WHERE id=?'
	    ,array($id_salle))) ) {
	    throw new Exception('La salle demandée n\'existe pas');
	    return false;
	}

	$formulaire = new shFormulaire;
	$formulaire->setSubmitText('Modifier cette salle');

	// Intitulé de la salle
	shField::text('Intitulé')
		->setValue($salle->intitule)
		->appendTo($formulaire);

	// Accès au personne a mobilité réduite
	shField::checkbox('Accès Handicapés')
		->setValue($salle->acces_handicap)
		->appendTo($formulaire);
	
	// Liste des batiments
	$select = shField::select('Batiment')
		->setValue($salle->id_batiment)
		->appendTo($formulaire);

	// On récupère les batiments
	$batiments = shSGBD::select ('SELECT batiment.id, batiment.intitule FROM batiment '.
		'ORDER BY batiment.intitule ASC');

	// Affectation des bâtiment à la selectbox
	foreach($batiments AS $batiment) {
	    $select->addOption($batiment->id, $batiment->intitule);
	}

	$formulaire->setCheck(function($formulaire) use ($salle) {
		    if (!$formulaire->isError()) {
			// On vérifie qu'on a pas le même intitulé qui existe
			$salle = shSGBD::selectOne('SELECT count(salle.id) AS count '.
				'FROM salle '.
				'WHERE intitule=:intitule AND id!=:id ',
				array (':intitule'=>$formulaire->getField('Intitulé')->getValue(),
				':id'=>$salle->id));
			if ($salle->count > 0) {
			    $formulaire->getField('Intitulé')->setError('Une autre salle possède le même intitulé');
			}
		    }
		});

	$formulaire->setSubmit(function($formulaire) use ($salle) {
		    // On crée le nouveau profil
		    shSGBD::update('UPDATE salle SET intitule=:intitule '.
			    ',id_batiment=:id_batiment '.
			    ',acces_handicap=:acces_handicap '.
			    'WHERE id=:id',
			    array( ':intitule' => $formulaire->getField('Intitulé')->getValue(),
			    ':id' => $salle->id,
			    ':id_batiment' => $formulaire->getField('Batiment')->getValue(),
			    ':acces_handicap' => $formulaire->getField('Accès Handicapés')->getValue()));
		    shAction::redirect('administration','salle');
		});

	$this->assign('formulaire', $formulaire);
    }


    /**
     * Efface une salle passé en paramètre
     * @param <integer> Identifiant de la salle à supprimer
     *
     * @todo Mettre les id_salle a null pour les cours ...
     */
    public function executeDelete($id_salle) {
	$this->setTitle('Suppression d\'une salle');

	// On efface la salle
	shSGBD::delete('DELETE FROM salle WHERE id=?',array($id_salle));

	// On met a null toute trace de cette salle dans les autres tables
	shSGBD::update('UPDATE seance SET id_salle=null WHERE id_salle=?',array($id_salle));

	// On retourne sur la page
	shAction::redirect('administration','salle');
    }
}
?>